package com.bird.thread.base.thread;

import java.util.concurrent.TimeUnit;

/**
 * @author: bird
 * @Data: 2021/7/2 14:57
 * @description: 演示：线程期间被中断的效果。
 */
public class JoinInterrupt {


    public static void main(String[] args) {
        // 主线程
        Thread mainThread = Thread.currentThread();

        // 子线程
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    // 子线程调用主线程的interrupt(),那么就是说明 通知JVM中断主线程，具体的决策权在于主线程。
                   mainThread.interrupt();
                    // 这里休息5s  模拟任务执行耗时5s
                    TimeUnit.SECONDS.sleep(5);
                    System.out.println("Thread1 finished.");
                } catch (InterruptedException e) {
                   // e.printStackTrace();
                    System.out.println("子线程被中断");
                }
            }
        });
        thread1.start();
        System.out.println("等待子线程运行完毕...");
        try {
            // 将子线程thread1加入主线程中。
            thread1.join();
        } catch (InterruptedException e) {
            // 如果这里抛出异常,说明-在主线程等待子线程的执行任务的过程中。抛出的异常。
            // 是等待的过程中抛出的异常. 也就是主线程被中断,主线程抛出异常, 而不是线程的抛出的异常。
          //  e.printStackTrace();
            System.out.println(Thread.currentThread().getName() + " 主线程被中断了");
            thread1.interrupt();// 中断子线程。 主线程调用子线程.interrupt()。于是就中断子线程。
        }
        System.out.println("所有的子线程已运行完毕...");
    }



    /*
     *
     * 总结：
     * 1:如果任何线程中断了当前的线程,那么当前的线程就会抛出异常,并且中断的标志会被清理掉。
       2:主线程调用子线程的join方法期间(子线程执行任务的时候)如果主线程被中断,
       * 那么主线程在thread1.join()的时候会抛出一个异常，这个异常是主线程抛出的异常。
     */
}
